Générer vos news flux RSS en PHP

Publié le 1 janvier 2012

Sommaire

Description d’un flux RSS

Tout d’abord RSS n’a pas d’acronyme attitré puisque selon les versions l’acronyme change. On a donc 3 formats qui peuvent désignés ces initiales :

  • Rich Site Summary (RSS 0.91)
  • RDF Site Summary (RSS 0.90 et 1.0)
  • Really Simple Syndication (RSS 2.0)

Ce standard est habituellement utilisé pour obtenir les mises à jour d’information dont la nature change fréquemment, typiquement cela peut être des listes de tâches dans un projet, des prix, des alertes de toutes natures des nouveaux emplois proposés, les sites d’information ou les blogs.

Source de l’information : http://fr.wikipedia.org/wiki/RSS_(format)

Ici nous allons appliqué ce standard pour fournir nos news dans un flux RSS.

Les bases d’un flux RSS

Nous utiliserons pour générer notre flux la version 2.0.

Dans l’exemple suivant on peut voir le contenu d’un flux RSS quelconque :'));

<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
    <channel>
        <title>Un titre</title>
        <description>News de mon site !</description>
        <link>http://news.monsite.org/</link>
        <item>
            <title>News 1</title>
            <description>Blablabla</description>
        </item>
    </channel>
</rss>

Le flux RSS & notre système de news

Génération du flux RSS de nos news en PHP

On va procéder en plusieurs étapes pour décrire notre flux :

  • étape 1 : création des informations nécessaires à la création du flux
  • étape 2 : création du corps de notre flux : insertion des news
  • étape 3 : fermeture de nos balises & enregistrement dans un fichier .xml

Étape 1 : création des informations nécessaires à la création du flux

On placera notre code dans une page nommée par exemple news.rss.php.

Il faut indiquer au navigateur que notre page est un flux RSS :

/* On va placer notre flux dans une variable nommée variable (pas original mais clair), 
ce qui nous permettra d'enregistrer le tout dans un fichier */
<?php
$variable = '<?xml version="1.0" encoding="iso-8859-1"?>'
     .'<rss version="2.0">'
     .'<channel>';

Maintenant nous allons définir une description du flux RSS.

$variable = $variable.'<title>Mon premier flux RSS</title>'
     .'<description>News de mon site !</description>'
     .'<link>Adresse URL de mon site</link>';

Ces balises sont assez explicites pour ne pas être expliquées en détails.

Étape 2 : création du corps de notre flux : insertion des news

On veut insérer nos news dans ce flux, il faut donc récupérer nos news qui sont dans notre base de données MySQL.

La récupération est identique à celle que l’on a effectué lors du tutoriel sur la création d’un système de news.

include_once('connexion.php'); // Inclusion de la connexion à MySQL
 
// Requête SQL
$sql = 'SELECT date_creation, titre, news FROM app_news ORDER BY date_creation DESC';
 
$query = mysql_query($sql, $dblink); // Envoi de la requête à la base de données
 
while($fetch=mysql_fetch_array($query))
{
      $titre = $fetch['titre'];
      $news = StripSlashes($fetch['news']);
 
      /* Ici nous avions l'affichage de notre news, que l'on va remplacer
      par l'affichage de nos balises */
     $variable = $variable.'&lt;item>'; // Affichage de la balise de d&eacute;but de notre news
     $variable = $variable.'&lt;title>'.$titre.'&lt;/title>';
           .'&lt;description>'.$news.'&lt;/description>';
           .'&lt;/item>'; // Fermeture de la balise
}

/* Une fois que nos news sont affich&eacute;, la connexion &agrave; MySQL n'est plus utile */
mysql_close($dblink);

Ici nous n’avons pas placé la date de création de la news, on peut la placé dans les balises pubDate, mais il faudra les convertir aux formats américains.

Ci-dessous nous avons rajoutés les lignes adéquates, par rapport au tutoriel de création du système de news les variables $date et $heure ne sont très peu modifiées.

On peut voir ici qu’il a été judicieux de créer notre date au format timestamp car on peut récupérer toutes les informations nécessaires à l’information de ce format de date de publication.

while($fetch=mysql_fetch_array($query))
{
      $titre = $fetch['titre'];
      $news = StripSlashes($fetch['news']);
 
      $date = date('M, d/m/Y', $fetch['date_creation']);
      $heure = date('H:i:s O', $fetch['date_creation']);
 
      $variable += '&lt;item>'; // Affichage de la balise de d&eacute;but de notre news
      $variable += '&lt;title>'.$titre.'&lt;/title>'
           .'&lt;pubDate>'.$date.' '.$heure.'&lt;/pubDate>'
           .'&lt;description>'.$news.'&lt;/description>'
           .'&lt;/item>'; // Fermeture de la balise
}
/* Une fois que nos news sont affich&eacute;, la connexion &agrave; MySQL n'est plus utile */
mysql_close($dblink);

Etape 3 : fermeture de nos balises & enregistrement dans un fichier .xml
Il faut désormais fermer nos balises channel et rss :

$variable += '</channel>'
     .'</rss>';

Maintenant nous aimerions que ce soit un fichier .xml et non un fichier php qui avec une entête un fichier xml. Nous allons donc crée un flux de données :

$fichier_xml = 'flux_news.xml'; // Nom du fichier .xml
 
/* On ouvre en lecture et écriture grâce au paramètre w+ appliquée à la fonction fopen();
place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. 
Si le fichier n'existe pas, on tente de le créer. */ 
$fp=fopen($fichier_xml,"w+");  
if ($fp)
{
	if (fwrite($handle, $variable) === FALSE)
	{
		echo 'Ne peut pas écrire, vérifier les droits en écriture.';
		exit;
	}
}
?>

Utilisation du flux RSS pour afficher vos news dans votre page web

Si nous pouvons nous connecter à MySQL pour avoir directement les news, on peut également les ressortir de notre page rss.

Dans une page nommée affiche_news_rss.php, nous pouvons placer le code suivant :

<?php 
 
$fichier_xml = 'flux_news.xml'; /* On place dans une variable le nom du fichier du flux RSS 
(celui que l'on a crée précédemment) pour pouvoir l'ouvrir */
 
$fp=fopen($fichier_xml,"r");  // Ouverture du fichier ( en lecture seule )
if ($fp)
{
   $raw = fread($fp, filesize($fichier_xml)); /* Lis le fichier, filesize() retourne
   la taille du fichier */
   fclose($fp);  // Fermeture du fichier
 
   if(eregi("<item>(.*)</item>",$raw,$rawitems))
   { 
     $items = explode("<item>", $rawitems[0]); /* Avec la fonction explode on coupe notre
     chaîne pour créer un tableau contenant nos news */
     $nb = count($items); // On compte le nombre de news
 
     // Tant que l'on a pas atteint le nombre maximum on incrémente i
     for($i=0; $i<$nb; $i++)
     {
       eregi("<title>(.*)</title>",$items[$i+1], $titre); /* On place le contenu qui est
       entre la balise title dans la variable titre */
       eregi("<description>(.*)</description>",$items[$i+1], $news);
       eregi("<pubDate>(.*)</pubDate>",$items[$i+1], $pubDate);
 
       // Ici on récupère la date dans notre format
       $date[0] = strtok($pubDate[0], ' ');
       $date[1] = strtok(' '); 
       /* Sur la deuxième utilisation de strtok on n'utilise pas le nom 
        * de la variable, $date[1] ne sera pas utilisée mais on doit décalée 
        * une fois pour récupérer l'heure 
        */
       $heure = strtok(' ');
 
       echo '<strong>'.$titre[1].'</strong> ajouté le '.$date[1].' à '.$heure;
       echo '<br />'.$news[1];
       echo '<br /><br />';
     }
   } 
} 
?>

Récapitulatif de la page

<?php
 
/* Création de l'entête XML */
$variable = '<?xml version="1.0" encoding="iso-8859-1"?>'
     .'<rss version="2.0">'
     .'<channel>';
 
$variable = $variable.'<title>Mon premier flux RSS</title>'
     .'<description>News de mon site !</description>'
     .'<link>Adresse URL de mon site</link>';
 
/* Inclusion du fichier de connexion MySQL */
include_once('connexion.php');
 
// Requête SQL
$sql = 'SELECT date_creation, titre, news FROM app_news ORDER BY date_creation DESC';
$query = mysql_query($sql, $dblink); // Envoi de la requête
 
while($fetch=mysql_fetch_array($query))
{
      $titre = $fetch['titre'];
      $news = StripSlashes($fetch['news']);
 
      $date = date('M, d/m/Y', $fetch['date_creation']);
      $heure = date('H:i:s O', $fetch['date_creation']);
 
      $variable = $variable.'<item>';
      $variable = $variable.'<title>'.$titre.'</title>'
           .'<pubDate>'.$date.' '.$heure.'</pubDate>'
           .'<description>'.$news.'</description>'
           .'</item>';
}
 
/* Fermeture du lien MySQL */
mysql_close($dblink);
 
$variable = $variable.'</channel>'
     .'</rss>';
 
$fichier_xml = 'flux_news.xml'; // Nom du fichier .xml
 
/* On ouvre en lecture et écriture grâce au paramètre w+ appliquée à la fonction fopen();
place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. 
Si le fichier n'existe pas, on tente de le créer. */ 
$fp=fopen($fichier_xml,"w+");  
if ($fp)
{
	if (fwrite($fp, $variable) === FALSE)
	{
		echo 'Ne peut pas écrire, vérifier les droits en écriture.';
		exit;
	}
}

?>